home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 June: Reference Library / Dev.CD Jun 96 RL / Dev.CD Jun 96 RL.toast / What's New? / Development Kits / Speech Recognition Mgr 1.5 / SR Sample Code / IM SR Example / main.c next >
Encoding:
Text File  |  1996-04-18  |  6.3 KB  |  278 lines  |  [TEXT/CWIE]

  1. // Speech Recognition Example
  2. //             combines routines from IM document into application
  3. //             uses MetroWerks' SIOUX window 
  4.  
  5. #include <SpeechRecognition.h>
  6.  
  7. #include <AppleEvents.h>
  8. #include <Devices.h>
  9. #include <Dialogs.h>
  10. #include <Events.h>
  11. #include <Fonts.h>
  12. #include <Quickdraw.h>
  13. #include <Menus.h>
  14. #include <Resources.h>
  15. #include <TextEdit.h>
  16. #include <ToolUtils.h>
  17. #include <Windows.h>
  18.  
  19. #include <SIOUX.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22.  
  23. // define this to be true if you want to use SR callbacks
  24. #define SR_CALLBACKS    0
  25.  
  26. #define    rMenuBar                128        /* Menubar resource id */
  27.  
  28. #define    mApple                    128        /* Apple menu resource id */
  29.  
  30. #define    mFile                    129        /* File menu resource id */
  31.  
  32. // External Prototypes
  33. extern SRRecognitionSystem    MyInitSpeechRecognition (void);
  34. extern SRLanguageModel         MyBuildLanguageModel (SRRecognitionSystem mySystem);
  35. extern OSErr                MyInstallSpeechAEHandlers (void);
  36. extern pascal OSErr            MyInstallNotificationCallBack (SRRecognizer recognizer);
  37. extern pascal void            MyRemoveNotificationCallBack (SRRecognizer recognizer);
  38. extern pascal void            MyIdleCheckForSpeechResult (void);
  39.  
  40. // Internal Prototypes
  41. Boolean                     Initialize (void);
  42. void                         EventLoop (void);
  43. void                         Terminate (void);
  44.  
  45. void                        HandleMouseDown (EventRecord * event);
  46. void                         HandleKeyDown (unsigned char keyChar);
  47. void                         HandleMenuSelect (long menuChoice);
  48.  
  49. pascal OSErr                 DummyAEHandler (AppleEvent *theAEevt, AppleEvent* reply, long refcon);
  50. pascal OSErr                 HandleQuitAE (AppleEvent *theAEevt, AppleEvent* reply, long refcon);
  51.  
  52. // Globals
  53. Boolean                gFinished = false;
  54.  
  55. SRRecognitionSystem    gRecSystem = NULL;
  56. SRLanguageModel        gLanguageModel = NULL;
  57. SRRecognizer        gRecognizer = NULL;
  58. Boolean                gListening = false;
  59.  
  60. // Routines
  61. void main (void)
  62. {
  63.     if ((gListening = Initialize ()) == true)
  64.         EventLoop ();
  65.     else
  66.         {
  67.         SysBeep (0);
  68.         printf ("Initialization failed.\n");
  69.         }
  70.         
  71.     Terminate ();
  72. }
  73.  
  74. Boolean Initialize (void)
  75. {
  76.     Boolean        successfulStartup = false;
  77.     OSErr        myErr = noErr;    
  78.     short        index;
  79.     EventRecord    event;
  80.     
  81.     InitGraf((Ptr) &qd.thePort);
  82.     InitFonts();
  83.     InitWindows();
  84.     InitMenus();
  85.     TEInit();
  86.     InitDialogs(nil);
  87.     InitCursor();
  88.  
  89.     for (index = 1; index <= 3; index++)
  90.         EventAvail(everyEvent, &event);
  91.  
  92.     if (!myErr)
  93.         myErr = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, 
  94.                                 NewAEEventHandlerProc (DummyAEHandler), 0, false);
  95.     if (!myErr)
  96.         myErr = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, 
  97.                                 NewAEEventHandlerProc (DummyAEHandler), 0, false);
  98.     if (!myErr)
  99.         myErr = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, 
  100.                                 NewAEEventHandlerProc (DummyAEHandler), 0, false);
  101.     if (!myErr)
  102.         myErr = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, 
  103.                                 NewAEEventHandlerProc (HandleQuitAE), 0, false);
  104.                                 
  105.     if (!myErr)
  106.         {
  107.         Handle menuBar = GetNewMBar(rMenuBar);
  108.         if (menuBar != nil)
  109.             {
  110.             SetMenuBar(menuBar);
  111.             DisposHandle(menuBar);
  112.             AddResMenu(GetMenuHandle(mApple), 'DRVR');    // add DA names to Apple menu 
  113.             DrawMenuBar();
  114.             }
  115.         else
  116.             myErr = (ResError() ? ResError() : 1);
  117.         }
  118.  
  119.     SIOUXSettings.standalone = false;
  120.     SIOUXSettings.setupmenus = false;
  121.     SIOUXSettings.initializeTB = false;
  122.     
  123.     SIOUXSettings.columns = 90;
  124.     
  125.     printf("Initializing.\n");
  126.     
  127.     SIOUXSetTitle ("\pSpeech Recognition Example");
  128.     
  129.     if ((gRecSystem = MyInitSpeechRecognition ()) == NULL)
  130.         myErr = true;
  131.     
  132.     if ((gLanguageModel = MyBuildLanguageModel (gRecSystem)) == NULL)
  133.         myErr = true;
  134.  
  135.     printf("\n");
  136.     printf("This program uses a language model with following BNF:\n");
  137.     printf("<TopLM>    = <call> <person> | schedule meeting with <person> | view today's schedule;\n");
  138.     printf("<call>    = call | phone | dial;\n");
  139.     printf("<person>= Arlo | Matt | Brent | my wife;\n");
  140.     printf("\n");
  141.         
  142.     if (!myErr)
  143.         myErr = SRNewRecognizer (gRecSystem, &gRecognizer, kSRDefaultSpeechSource);
  144.     
  145.     if (!myErr)
  146.         myErr = MyInstallSpeechAEHandlers ();
  147.     
  148. #if SR_CALLBACKS
  149.     if (!myErr)
  150.         myErr = MyInstallNotificationCallBack (gRecognizer);
  151. #endif
  152.     
  153.     if (!myErr)
  154.         myErr = SRSetLanguageModel (gRecognizer, gLanguageModel);
  155.     
  156.     if (!myErr)
  157.         myErr = SRStartListening (gRecognizer);
  158.     
  159.     if (!myErr)
  160.         successfulStartup = true;
  161.     
  162.     return successfulStartup;
  163. }
  164.  
  165. void Terminate (void)
  166. {
  167.     printf("Terminating.\n");
  168.     
  169.     if (gListening) SRStopListening (gRecognizer);
  170.     
  171.     if (gRecognizer)
  172.         {
  173.         MyRemoveNotificationCallBack (gRecognizer);
  174.         SRReleaseObject (gRecognizer);
  175.         }
  176.     
  177.     if (gLanguageModel) SRReleaseObject (gLanguageModel);
  178.     if (gRecSystem) SRReleaseObject (gRecSystem);
  179. }
  180.  
  181. void EventLoop (void)
  182. {
  183.     while (!gFinished)
  184.         {
  185.         EventRecord        event;
  186.         unsigned char    keyChar;
  187.         
  188.         if (WaitNextEvent(everyEvent, &event, 1, nil))
  189.             {
  190.             // only handle event if SIOUX doesn't
  191.             if (!SIOUXHandleOneEvent(&event))
  192.                 switch (event.what)
  193.                     {
  194.                     case mouseDown :
  195.                         HandleMouseDown (&event);
  196.                         break;
  197.                     case keyDown :
  198.                         keyChar = event.message & charCodeMask;
  199.                         if (event.modifiers & cmdKey)
  200.                             HandleMenuSelect (MenuKey(keyChar));
  201.                         break;
  202.                     case kHighLevelEvent :
  203.                         AEProcessAppleEvent(&event);
  204.                         break;
  205.                     default :
  206.                         break;
  207.                     }
  208.             }
  209. #if SR_CALLBACKS
  210.         MyIdleCheckForSpeechResult ();
  211. #endif
  212.         }
  213. }
  214.  
  215. void HandleMouseDown (EventRecord * event)
  216. {
  217.     WindowPtr    window;
  218.     short        partCode = FindWindow (event->where, &window);
  219.     
  220.     switch (partCode)
  221.         {
  222.         case inSysWindow :
  223.             SystemClick (event, window);
  224.             break;
  225.         case inContent:
  226.             break;
  227.         case inMenuBar :
  228.             HandleMenuSelect (MenuSelect(event->where));
  229.             break;
  230.         case inDrag :
  231.             DragWindow (window, event->where, &qd.screenBits.bounds);
  232.             break;
  233.         case inGoAway:
  234.             if (TrackGoAway (window, event->where))
  235.                 gFinished = true;
  236.             break;
  237.         default :
  238.             break;
  239.         }
  240.     
  241.     HiliteMenu (0);
  242. }
  243.  
  244. void HandleMenuSelect (long menuChoice)
  245. {
  246.     short     itemNum;
  247.     Str255    daName;
  248.     GrafPtr    ourPort;
  249.     
  250.     itemNum = LoWord(menuChoice);
  251.     switch (HiWord(menuChoice))
  252.         {
  253.         case mApple :
  254.             GetItem (GetMenuHandle(mApple), itemNum, daName);
  255.             GetPort (&ourPort);
  256.             OpenDeskAcc (daName);
  257.             SetPort (ourPort);
  258.             break;
  259.         case mFile :
  260.             // all we've got is quit
  261.             gFinished = true;
  262.             break;                
  263.         default :
  264.             break;
  265.         }
  266. }
  267.  
  268. pascal OSErr DummyAEHandler (AppleEvent */*theAEevt*/, AppleEvent* /*reply*/, long /*refcon*/)
  269. {
  270.     return noErr;
  271. }
  272.  
  273. pascal OSErr HandleQuitAE (AppleEvent */*theAEevt*/, AppleEvent* /*reply*/, long /*refcon*/)
  274. {
  275.     gFinished = true;
  276.     return noErr;
  277. }
  278.